package com.wenx.v3system.modular.oauth.prop;

import cn.hutool.core.util.StrUtil;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * OAuth2客户端配置类
 * 支持负载均衡和服务发现
 * 
 * @author wenx
 */
@Data
@Component
@ConfigurationProperties(prefix = "cloud.auth.client")
public class OAuth2ClientProp {

    /**
     * 是否启用OAuth2客户端功能
     */
    private boolean enabled = true;

    /**
     * 是否启用负载均衡（服务发现）
     */
    private boolean loadBalancerEnabled = true;

    /**
     * 认证服务名称（支持服务发现）
     */
    private String authServiceName = "v3-auth";

    /**
     * 认证服务器地址（直连模式）
     * 当loadBalancerEnabled=false时使用
     */
    private String authServerUrl = "http://v3-auth";

    /**
     * OAuth2端点配置
     */
    private String tokenEndpoint = "/oauth2/token";
    private String checkTokenEndpoint = "/oauth2/introspect";
    private String revokeTokenEndpoint = "/oauth2/revoke";

    /**
     * 客户端凭据
     */
    private String clientId = "v3-system-client";
    private String clientSecret = "v3-system-secret";

    /**
     * 授权范围
     */
    private String scope = "read write";

    /**
     * 重定向URI
     */
    private String redirectUri = "http://localhost:8991/oauth2/callback";

    /**
     * HTTP配置
     */
    private HttpConfig http = new HttpConfig();

    @Data
    public static class HttpConfig {
        /**
         * 连接超时时间（毫秒）
         */
        private int connectTimeout = 5000;

        /**
         * 读取超时时间（毫秒）
         */
        private int readTimeout = 10000;
    }

    /**
     * 获取基础服务URL
     * 根据负载均衡配置返回服务名或直连地址
     */
    public String getBaseUrl() {
        if (loadBalancerEnabled && StrUtil.isNotBlank(authServiceName)) {
            // 使用服务名，支持负载均衡
            return "http://" + authServiceName;
        } else {
            // 使用直连地址
            return authServerUrl;
        }
    }

    /**
     * 获取完整的令牌端点URL
     */
    public String getTokenUrl() {
        return getBaseUrl() + tokenEndpoint;
    }

    /**
     * 获取完整的令牌检查端点URL
     */
    public String getCheckTokenUrl() {
        return getBaseUrl() + checkTokenEndpoint;
    }

    /**
     * 获取完整的令牌撤销端点URL
     */
    public String getRevokeTokenUrl() {
        return getBaseUrl() + revokeTokenEndpoint;
    }
}
